// 保存page函数
let native = Page;
//  重新更改page函数指向
Page = (obj) => {
    //  获取混入的数组
    let { mixins = []} = obj;
    //  深度拷贝实例
    let merge = new Merge();
    //  删除混入数组
    Reflect.deleteProperty(obj, "mixins");
    //  pageData 如果混入数组小于等于0，则还使用原有数据，否则进行深入拷贝
    let pageData = mixins.length <= 0 ? obj : merge.start(obj, ...mixins);
    native(pageData);
    merge = null;
}

class Merge {
    constructor() { }
    //  开始深度拷贝
    start(rootObj, ...objs) {
        //  根数据
        let root = {};
        //  遍历混入数组，执行合并
        objs.forEach((el) => {
            root = Merge.recursive(rootObj, el);
        })
        return root;
    }
    static recursive = (rootObj, obj) => {
        //  遍历需要混入的对象
        for (let attr in obj) {
            //  如果根里元素里面不存在直接添加
            //  如果是个对象的话，进行深度拷贝
            //  如果是其他情况的话就直接添加
            if (rootObj[attr] === undefined) {
                rootObj[attr] = obj[attr];
            }
            else if (Merge.isObject(obj[attr])) {
                Merge.recursive(rootObj[attr], obj[attr])
            }
            else {
                rootObj[attr] = obj[attr];
            }
        }
        //  返回跟数据
        return rootObj;
    }
    static isObject = (obj) => {
        //  判断是否为对象
        return Object.prototype.toString.call(obj).includes("Object");
    }
}
